function melhor_pos_global = psoVizinhanca(tipo)


dimensoes = 30;
populacao = 20;
prob_small_world = 0.2;

if tipo == 1 
    vizinhanca = ones(populacao,populacao);
elseif tipo == 2
    vizinhanca = zeros(populacao,populacao);
    for i = 1:populacao-1 
        vizinhanca(i,i+1) = 1;
        vizinhanca(i+1,i) = 1;
    end
    vizinhanca(1,populacao) = 1;
    vizinhanca(populacao,1) = 1;
elseif tipo == 3
    vizinhanca = zeros(populacao,populacao);
    for i = 1:populacao-1 
        vizinhanca(i,i+1) = 1;
        vizinhanca(i+1,i) = 1;
    end
    vizinhanca(1,populacao) = 1;
    vizinhanca(populacao,1) = 1;
    for i = 1:populacao 
        for j = 1:populacao
            if vizinhanca(i,j) == 1 
                if rand() < prob_small_world
                    adicionou_aresta = 0;
                    while adicionou_aresta == 0
                        novo_vizinho = floor(rand()*20) + 1;
                        if (vizinhanca(i, novo_vizinho) == 0 && novo_vizinho ~= i)
                            vizinhanca(i, novo_vizinho) = 1;
                            vizinhanca(novo_vizinho, i) = 1;
                            vizinhanca(i,j) = 0;
                            vizinhanca(j,i) = 0;
                            adicionou_aresta = 1;
                        end
                    end
                end
            end
        end
    end
end

lower = -30;
upper = 30;
iteracoes = 1000;
j=0;
omega = 0.5;
phi_social = 0.9;
phi_cognitivo = 0.1;

particulas = rand(populacao, dimensoes);
particulas = lower + particulas * (upper - lower);
melhor_posicao = particulas;
valores = avalia2(particulas);
[melhor_valor, pos] = min(valores);
melhor_valor_global = melhor_valor;
melhor_pos_global = particulas(pos,:);
velocidades = lower + rand(populacao, dimensoes) * (upper - lower);
melhor_valor_vizinhos = zeros(populacao,1);
melhor_pos_vizinhos = zeros(populacao, dimensoes);

while j<iteracoes
    j = j + 1
    rp = rand(populacao, dimensoes);
    rg = rand(1);
    velocidades = omega * velocidades;
    velocidades = velocidades + phi_cognitivo .* rp .* (melhor_posicao - particulas); 
    for i = 1:populacao
        valores_vizinhos = 1000 * ones(populacao,1);
        valores_vizinhos = (1-vizinhanca(:,i)).*valores_vizinhos + vizinhanca(:,i).*valores;
        [melhor_valor_vizinho,qual_vizinho] = min(valores_vizinhos);
        melhor_valor_vizinhos(i) = melhor_valor_vizinho;
        melhor_pos_vizinhos(i,:) = particulas(qual_vizinho,:);
    end
    velocidades = velocidades + phi_social * rg * (melhor_pos_vizinhos - particulas);
    cap_max = 10 * ones(populacao, dimensoes);
    cap_min = -10 * ones(populacao, dimensoes);
    velocidades = min(velocidades, cap_max);
    velocidades = max(velocidades, cap_min);
    particulas_novo = particulas + velocidades;
    valores_novo = avalia2(particulas);
    minimos = min(valores, valores_novo);
    aux = (minimos == valores_novo);
    aux2 = zeros(populacao, dimensoes);
    for i=1:dimensoes
        aux2(:,i) = aux;
    end
    particulas = (1-aux2).*particulas + aux2.*particulas_novo;
    [melhor_valor, pos] = min(valores_novo);
    if melhor_valor < melhor_valor_global 
        melhor_pos_global = particulas(pos,:);
        melhor_valor_global = melhor_valor;
    end
    particulas = particulas_novo;
    valores = valores_novo;
%     if mod(j,1) == 0
%         plot(particulas(:,1),particulas(:,2),'*')
%         axis([-30 30 -30 30]);
%         drawnow
%     end
end
melhor_pos_global
melhor_valor_global
vizinhanca
    